home *** CD-ROM | disk | FTP | other *** search
- ////////////////////////////////////////////////////////////////
- // File - PCI_DIAG_LIB.C
- //
- // Utility functions for printing card information,
- // detecting PCI cards, and accessing PCI configuration
- // registers.
- //
- ////////////////////////////////////////////////////////////////
-
- #include "../../include/windrvr.h"
- #ifdef _USE_SPECIFIC_KERNEL_DRIVER_
- #undef WD_Open
- #define WD_Open WD_OpenKernelHandle
- #if defined(UNIX)
- #undef WD_FUNCTION
- #define WD_FUNCTION(wFuncNum,h,pParam,dwSize,fWait) \
- ((ULONG) ioctl((int)(h), wFuncNum, pParam))
- #endif
- #endif
- #include "pci_diag_lib.h"
- #include "print_struct.h"
- #include <stdio.h>
-
- // input of command from user
- static char line[256];
-
- BOOL PCI_Get_WD_handle(HANDLE *phWD)
- {
- WD_VERSION ver;
-
- *phWD = INVALID_HANDLE_VALUE;
- *phWD = WD_Open();
-
- // Check whether handle is valid and version OK
- if (*phWD==INVALID_HANDLE_VALUE)
- {
- printf("Failed opening " WD_PROD_NAME " device\n");
- return FALSE;
- }
-
- BZERO(ver);
- WD_Version(*phWD,&ver);
- if (ver.dwVer<WD_VER)
- {
- printf("Incorrect " WD_PROD_NAME " version\n");
- WD_Close (*phWD);
- *phWD = INVALID_HANDLE_VALUE;
- return FALSE;
- }
-
- return TRUE;
- }
-
- void PCI_Print_card_info(WD_PCI_SLOT pciSlot)
- {
- HANDLE hWD;
- WD_PCI_CARD_INFO pciCardInfo;
-
- if (!PCI_Get_WD_handle(&hWD))
- return;
-
- BZERO(pciCardInfo);
- pciCardInfo.pciSlot = pciSlot;
- WD_PciGetCardInfo (hWD, &pciCardInfo);
-
- WD_CARD_print(&pciCardInfo.Card, " ");
-
- WD_Close (hWD);
- }
-
- void PCI_Print_all_cards_info()
- {
- HANDLE hWD;
- int i;
- WD_PCI_SCAN_CARDS pciScan;
- WD_PCI_SLOT pciSlot;
- WD_PCI_ID pciId;
-
- if (!PCI_Get_WD_handle(&hWD))
- return;
-
- BZERO(pciScan);
- pciScan.searchId.dwVendorId = 0;
- pciScan.searchId.dwDeviceId = 0;
-
- printf ("Pci bus scan:\n\n");
- WD_PciScanCards (hWD,&pciScan);
-
- for (i=0; i<(int)pciScan.dwCards; i++)
- {
- CHAR tmp[100];
- pciId = pciScan.cardId[i];
- pciSlot = pciScan.cardSlot[i];
- printf("Bus %d Slot %d Function %d, VendorID %04x DeviceID %04x\n",
- pciSlot.dwBus, pciSlot.dwSlot, pciSlot.dwFunction, pciId.dwVendorId,
- pciId.dwDeviceId);
-
- PCI_Print_card_info(pciSlot);
- printf("Press Enter to continue to next slot\n");
- fgets(tmp, sizeof(tmp), stdin);
- }
- WD_Close (hWD);
- }
-
- DWORD PCI_ReadBytes(HANDLE hWD, WD_PCI_SLOT pciSlot, DWORD dwOffset,
- DWORD dwBytes)
- {
- WD_PCI_CONFIG_DUMP pciCnf;
- DWORD dwVal = 0;
-
- BZERO(pciCnf);
- pciCnf.pciSlot = pciSlot;
- pciCnf.pBuffer = &dwVal;
- #if defined(_BIGENDIAN)
- pciCnf.pBuffer = (char *) pciCnf.pBuffer + sizeof(DWORD)-dwBytes;
- #endif
- pciCnf.dwOffset = dwOffset;
- pciCnf.dwBytes = dwBytes;
- pciCnf.fIsRead = TRUE;
- WD_PciConfigDump(hWD,&pciCnf);
- return dwVal;
- }
-
- void PCI_WriteBytes(HANDLE hWD, WD_PCI_SLOT pciSlot, DWORD dwOffset,
- DWORD dwBytes, DWORD dwData)
- {
- WD_PCI_CONFIG_DUMP pciCnf;
-
- BZERO(pciCnf);
- pciCnf.pciSlot = pciSlot;
- pciCnf.pBuffer = &dwData;
- #if defined(_BIGENDIAN)
- pciCnf.pBuffer = (char *) pciCnf.pBuffer + sizeof(DWORD)-dwBytes;
- #endif
- pciCnf.dwOffset = dwOffset;
- pciCnf.dwBytes = dwBytes;
- pciCnf.fIsRead = FALSE;
- WD_PciConfigDump(hWD,&pciCnf);
- }
-
- void PCI_EditConfigReg(WD_PCI_SLOT pciSlot)
- {
- HANDLE hWD;
- struct
- {
- CHAR *name;
- DWORD dwOffset;
- DWORD dwBytes;
- DWORD dwVal;
- } fields[30] = {
- { "VID", 0x0, 2 },
- { "DID", 0x2, 2 },
- { "CMD", 0x4, 2 },
- { "STS", 0x6, 2 },
- { "RID", 0x8, 1 },
- { "CLCD", 0x9, 3 },
- { "CALN", 0xc, 1 },
- { "LAT", 0xd, 1 },
- { "HDR", 0xe, 1 },
- { "BIST", 0xf, 1 },
- { "BADDR0", 0x10, 4 },
- { "BADDR1", 0x14, 4 },
- { "BADDR2", 0x18, 4 },
- { "BADDR3", 0x1c, 4 },
- { "BADDR4", 0x20, 4 },
- { "BADDR5", 0x24, 4 },
- { "EXROM", 0x30, 4 },
- { "INTLN", 0x3c, 1 },
- { "INTPIN", 0x3d, 1 },
- { "MINGNT", 0x3e, 1 },
- { "MAXLAT", 0x3f, 1 },
- { NULL, 0, 0 },
- { NULL, 0, 0 }
- };
-
- int cmd;
- int i;
-
- if (!PCI_Get_WD_handle (&hWD))
- return;
-
- do
- {
- int row;
- int col;
-
- printf ("\n");
- printf ("Edit PCI configuration registers\n");
- printf ("--------------------------------\n");
- for (row = 0; row<=10; row++)
- {
- for (col = 0; col <=1; col++)
- {
- if (col==0) i = row;
- else i = row + 10;
-
- if (row==10 && col==0)
- {
- printf("%26s","");
- }
- else
- {
- DWORD dwVal;
- dwVal = PCI_ReadBytes(hWD, pciSlot, fields[i].dwOffset,
- fields[i].dwBytes);
- fields[i].dwVal = dwVal;
- printf ("%2d. %6s : %0*x %*s ",i+1, fields[i].name,
- fields[i].dwBytes*2, fields[i].dwVal,
- 8-fields[i].dwBytes*2, "");
- }
- if (col==1) printf ("\n");
- }
- }
-
- printf ("99. Back to main menu\n");
- printf ("Choose register to read from / write to, or 99 to exit: ");
- cmd = 0;
- fgets(line, sizeof(line), stdin);
- sscanf(line, "%d",&cmd);
- if (cmd>=1 && cmd <=21)
- {
- i = cmd-1;
- printf ("Enter value to write to %s register (or 'X' to cancel): ",
- fields[i].name);
- fgets(line, sizeof(line), stdin);
- if (toupper (line[0])!='X')
- {
- DWORD dwVal;
- dwVal = 0;
- sscanf(line,"%x",&dwVal);
- if ((dwVal>0xff && fields[i].dwBytes==1)||
- (dwVal>0xffff && fields[i].dwBytes==2)||
- (dwVal>0xffffff && fields[i].dwBytes==3))
- {
- printf ("Error: value to big for register\n");
- }
- else
- {
- PCI_WriteBytes(hWD, pciSlot, fields[i].dwOffset,
- fields[i].dwBytes, dwVal);
- }
- }
- }
- } while (cmd!=99);
-
- WD_Close (hWD);
- }
-
- BOOL PCI_ChooseCard(WD_PCI_SLOT *ppciSlot)
- {
- BOOL fHasCard;
- WD_PCI_SCAN_CARDS pciScan;
- DWORD dwVendorID, dwDeviceID;
- HANDLE hWD;
- DWORD i;
-
- if (!PCI_Get_WD_handle (&hWD))
- return FALSE;
-
- fHasCard = FALSE;
-
- for (;!fHasCard;)
- {
- dwVendorID = 0;
- printf ("Enter VendorID: ");
- fgets(line, sizeof(line), stdin);
- sscanf (line, "%x",&dwVendorID);
- if (dwVendorID==0)
- break;
-
- printf ("Enter DeviceID: ");
- fgets(line, sizeof(line), stdin);
- sscanf (line, "%x",&dwDeviceID);
-
- BZERO(pciScan);
- pciScan.searchId.dwVendorId = dwVendorID;
- pciScan.searchId.dwDeviceId = dwDeviceID;
- WD_PciScanCards (hWD, &pciScan);
- if (pciScan.dwCards==0) // Find at least one card
- {
- printf("Could not find PCI card\n");
- }
- else if (pciScan.dwCards==1)
- {
- *ppciSlot = pciScan.cardSlot[0];
- fHasCard = TRUE;
- }
- else
- {
- printf("Found %d matching PCI cards\n", pciScan.dwCards);
- printf("Select card (1-%d): ", pciScan.dwCards);
- i = 0;
- fgets(line, sizeof(line), stdin);
- sscanf (line, "%d",&i);
- if (i>=1 && i <=pciScan.dwCards)
- {
- *ppciSlot = pciScan.cardSlot[i-1];
- fHasCard = TRUE;
- }
- else printf ("Choice out of range\n");
- }
- if (!fHasCard)
- {
- printf ("Do you want to try a different VendorID/DeviceID? ");
- fgets(line, sizeof(line), stdin);
- if (toupper(line[0])!='Y')
- break;
- }
- }
-
- WD_Close (hWD);
-
- return fHasCard;
- }
-